/*
 * Copyright 2009 Cedric Priscal
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. 
 */
package com.sagittariusjin.android.serialportbecoroutinelib

import android.util.Log
//import io.netty.buffer.ByteBufUtil
import java.io.*
import java.lang.*
import kotlin.String



internal class SerialPort(device: File, baudrate: Int, flags: Int) {
    /*
	 * Do not remove or rename the field mFd: it is used by native method close();
	 */
    private val mFd: FileDescriptor?
    private val mFileInputStream: FileInputStream
    private val mFileOutputStream: FileOutputStream
    // Getters and setters
    val inputStream: InputStream
        get() = mFileInputStream

    val outputStream: OutputStream
        get() = mFileOutputStream

    external fun open(path: String, baudrate: Int, flags: Int): FileDescriptor?
    external fun close()
    companion object {
        private const val TAG = "SerialPortCoroutine"
        // JNI


        init {
            System.loadLibrary("serialportbecoroutinelib")
        }
    }

    init { /* Check access permission */
        if (!device.canRead() || !device.canWrite()) {
            try { /* Missing read/send permission, trying to chmod the file */
                val su: Process
                su = Runtime.getRuntime().exec("/system/xbin/su")
                val cmd = ("chmod 666 " + device.getAbsolutePath() + "\n"
                        + "exit\n")
                su.outputStream.write(cmd.toByteArray())
                su.outputStream.flush()
                if (su.waitFor() != 0 || !device.canRead()
                    || !device.canWrite()
                ) {
                    throw SecurityException("文件权限初始化失败")
                }
            } catch (e: Exception) {
                e.printStackTrace()
                throw SecurityException(e.message)
            }
        }
            Log.i(TAG,"-------串口权限初始化完毕")
        mFd = open(
            device.getAbsolutePath(),
            baudrate,
            flags
        )
        if (mFd == null) {
            Log.e(
                TAG,
                "native open returns null"
            )
            throw IOException()
        }else {
         Log.i(TAG,"串口地址---${device.absolutePath}，波特率----${baudrate},----串口打开")
        }
        mFileInputStream = FileInputStream(mFd)
        mFileOutputStream = FileOutputStream(mFd)
    }
}